import { type Router } from 'vue-router'
import { isPathMatch } from '../utils/validate'
import { getUserInfo, getRouters } from '@/api/system/user'

// 引入用户路由store
import { useUserInfoStore } from '@/stores/useUserInfoStore'
// 存储用户身份信息、路由信息
let userInfoStore: ReturnType<typeof useUserInfoStore>

/**
 * 白名单
 */
const whiteList = ['/login', '/register']
const isWhiteList = (path: string) => {
  return whiteList.some((pattern) => isPathMatch(pattern, path))
}

/**
 * 动态添加路由 预处理处理  将  /Home 转换成    ()=>import(`../views/Home.vue`)
 * @param userRouters 路由
 */
function dealComponentString2Import(userRouters: any[]) {
  const views = import.meta.glob('../views/**/*.vue')

  userRouters.forEach((item: any) => {
    //1  动态加载元素
    const dynamicView = views[`../views${item.component}.vue`]
    item.component = dynamicView

    //2 处理子元素 component 属性
    if (item.children) {
      item.children.forEach((child: any) => {
        const childView = views[`../views${child.component}.vue`]
        child.component = childView
      })
    }
  })

  return userRouters
}
/**
 * 获取用户身份
 *
 * //遍历子路由，拼接path路径
 *
 *
 * 1 解决 默认路由信息如下：
 * {
 *  "path": "/system",
 *   component:'/Home'
 *   children:[
 *        {
 *         "path": "/user",
 *          component:'/system/user/index'
 *        }
 *    ]
 * }
 * 修改为：
 * {
 *  "path": "/system",
 *   component:'/Home'
 *   children:[
 *        {
 *         "path": "/system/user",
 *          component:'/system/user/index'
 *        }
 *    ]
 * }
 *
 * 2 处理子元素 component 属性 动态导入
 *
 *
 */
function getUserPermission(): Promise<any> {
  /**
   * 如果不存在用户身份信息，则从接口中获取用户身份信息，
   * 同时拉取路由权限，
   *  并生成菜单（信息存储在 pinia中，菜单根据pinia信息动态生成）
   */
  return new Promise(async (resolve) => {
    // 获取用户信息
    userInfoStore.userInfo = (await getUserInfo()) as any

    //获取用户路由
    const { data: routers } = await getRouters()

    routers.forEach((item: any) => {
      //2.2 处理子元素 component 属性
      if (item.children) {
        item.children.forEach((child: any) => {
          child.path = item.path + child.path
        })
      }
    })

    //将路由信息存储在pinia中
    console.log('1.1 第一次： JSON.stringify(routers) :', JSON.stringify(routers))
    userInfoStore.setUserRouters(JSON.parse(JSON.stringify(routers)))
    resolve(routers)
  })
}

/**
 * 动态添加路由
 * @param router
 * @param dynamicRouters
 */
function addRouters(router: Router, dynamicRouters: any[]) {
  //动态添加路由 预处理处理 将 /Home 转换成 ()=>import(../views/Home.vue)
  dynamicRouters = dealComponentString2Import(dynamicRouters)

  //动态添加路由
  dynamicRouters.forEach((item: any) => {
    router.addRoute(item)
  })

  userInfoStore.isAddRouter = true
}

/**
 *
 * 路由切换前检查权限
 * @param router
 */
export function permissionCheck(router: Router) {
  router.beforeEach((to, from, next) => {
    userInfoStore = useUserInfoStore()

    const token = sessionStorage.getItem('token')
    // 已登录状态
    if (token) {
      if (to.path === '/login') {
        next({ path: '/' })
        // NProgress.done()
      } else if (isWhiteList(to.path)) {
        next()
      } else {
        // 已登录状态，且要跳转的页面不是登录页 需要验证用户身份是否加载，如果没有用户身份则需要加载
        // 优先从缓存中获取用户身份信息
        if (!userInfoStore.userInfo) {
          getUserPermission().then((dynamicRouters: any[]) => {
            addRouters(router, dynamicRouters)
            next({ ...to, replace: true })
          })
        } else {
          // 缓存中有用户身份信息，则需要判断用户权限路由是否加载，如果没有则需要加载  刷新之后 router会重置，需要重新再加载一次
          if (!userInfoStore.isAddRouter) {
            const dynamicRouters = JSON.parse(JSON.stringify(userInfoStore.userRouters))
            addRouters(router, dynamicRouters)
            next({ ...to, replace: true })
          } else {
            next()
          }
        }
      }
    }
    // 未登录状态
    else {
      console.log('2 :', 2)

      if (isWhiteList(to.path)) {
        next()
      } else {
        next(`/login?redirect=${to.path}`)
      }
    }
  })
}
